/**
 * AJAX 请求封装工具
 * @param {Object} options 请求配置对象
 * @returns {Promise} 返回Promise对象
 */
import Cookies from "js-cookie";

function ajaxRequest(options) {
  // 默认配置
  const defaults = {
    url: "",
    method: "GET",
    data: null,
    headers: {},
    timeout: 10000, // 默认10秒超时
    responseType: "json",
    withCredentials: false, // 是否携带跨域凭证
  };

  // 合并配置
  const config = { ...defaults, ...options };

  // 参数验证
  if (!config.url) {
    return Promise.reject(new Error("URL is required"));
  }

  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();

    // 处理GET请求的查询参数
    let queryString = "";
    if (config.method.toUpperCase() === "GET" && config.data) {
      queryString =
        "?" +
        Object.entries(config.data)
          .map(
            ([key, value]) =>
              `${encodeURIComponent(key)}=${encodeURIComponent(value)}`
          )
          .join("&");
    }

    // 打开连接
    xhr.open(
      config.method,
      import.meta.env.VITE_APP_BASE_API + config.url + queryString,
      true
    );

    // 设置响应类型
    xhr.responseType = config.responseType;

    // 设置超时
    xhr.timeout = config.timeout;

    // 设置跨域凭证
    xhr.withCredentials = config.withCredentials;

    // 设置请求头
    const token = Cookies.get("Admin-Token");
    if (token) {
      config.headers["Authorization"] = "Bearer " + token;
    }
    for (const [key, value] of Object.entries(config.headers)) {
      xhr.setRequestHeader(key, value);
    }

    // 请求完成处理
    xhr.onload = function () {
      if (xhr.status >= 200 && xhr.status < 300) {
        resolve(xhr.response);
      } else {
        reject(new Error(`Request failed with status ${xhr.status}`));
      }
    };

    // 错误处理
    xhr.onerror = function () {
      reject(new Error("Network error"));
    };

    // 超时处理
    xhr.ontimeout = function () {
      reject(new Error("Request timeout"));
    };

    // 发送请求
    if (config.method.toUpperCase() === "GET" || !config.data) {
      xhr.send();
    } else {
      // 判断发送的数据类型
      let requestData = config.data;
      if (config.headers["Content-Type"] === "application/json") {
        requestData = JSON.stringify(config.data);
      } else if (
        config.headers["Content-Type"] === "application/x-www-form-urlencoded"
      ) {
        requestData = Object.entries(config.data)
          .map(
            ([key, value]) =>
              `${encodeURIComponent(key)}=${encodeURIComponent(value)}`
          )
          .join("&");
      }
      xhr.send(requestData);
    }
  });
}

/**
 * GET 请求快捷方法
 * @param {string} url 请求地址
 * @param {Object} params 查询参数
 * @param {Object} headers 请求头
 * @returns {Promise}
 */
function get(url, params = {}, headers = {}) {
  return ajaxRequest({
    url,
    method: "GET",
    data: params,
    headers,
  });
}

/**
 * POST 请求快捷方法
 * @param {string} url 请求地址
 * @param {Object} data 请求体数据
 * @param {Object} headers 请求头
 * @returns {Promise}
 */
function post(
  url,
  data = {},
  headers = { "Content-Type": "application/json" }
) {
  return ajaxRequest({
    url,
    method: "POST",
    data,
    headers,
  });
}

/**
 * PUT 请求快捷方法
 * @param {string} url 请求地址
 * @param {Object} data 请求体数据
 * @param {Object} headers 请求头
 * @returns {Promise}
 */
function put(url, data = {}, headers = { "Content-Type": "application/json" }) {
  return ajaxRequest({
    url,
    method: "PUT",
    data,
    headers,
  });
}

/**
 * DELETE 请求快捷方法
 * @param {string} url 请求地址
 * @param {Object} data 请求体数据
 * @param {Object} headers 请求头
 * @returns {Promise}
 */
function del(url, data = {}, headers = { "Content-Type": "application/json" }) {
  return ajaxRequest({
    url,
    method: "DELETE",
    data,
    headers,
  });
}

// 导出方法
export default {
  request: ajaxRequest,
  get,
  post,
  put,
  delete: del,
};
